import ScorePannel from "./ScorePanel";
import Snake from "./Snakes";
import Food from "./Food";
// 游戏控制器  控制其他所有类
class GameControl {
  // 定义三个属性
  snake: Snake;
  food: Food;
  scorePannel: ScorePannel;
  // 存移动方向  按键
  direction: string = "";
  // 游戏是否结束
  islive = true;
  constructor() {
    this.snake = new Snake();
    this.food = new Food();
    this.scorePannel = new ScorePannel();
    this.init();
  }

  //方法
  // 游戏的初始化方法  调用后游戏开始
  init() {
    // 绑定键盘按下的事件
    document.addEventListener("keydown", this.keydownHandler.bind(this));
    this.run();
  }

  keydownHandler(event: KeyboardEvent) {
    //    console.log(event.key);
    // console.log(this);
    //  需要检查 用户输入值 是否 合法
    this.direction = event.key;
  }
  // 移动方法  根据方向 direction  位置改变  上下左右  top left
  run() {
    // 获取当前蛇的坐标
    let X = this.snake.X;
    let Y = this.snake.Y;
    // 根据方向完成处理  x y
    switch (this.direction) {
      case "ArrowUp":
      case "Up":
       Y -= 10;
        break;
      case "ArrowDown":
      case "Down":
        Y += 10;
        break;
      case "ArrowLeft":
      case "Left":
        X -= 10;
        break;
      case "ArrowRight":
      case "Right":
       X += 10;
        break;
    }
    // 检查是否吃到啦食物
    this.checkEat(X,Y)
   
    // 重新赋值
   try {
    this.snake.X = X;
    this.snake.Y = Y;
   } catch (e) {
    // e报错 断言类型 Error |  alert((e as Error).message)
    alert((e as Error).message + '  游戏结束')

    this.islive=false
   }

    this.islive &&
      setTimeout(
        this.run.bind(this),
        300 - (this.scorePannel.level - 1) * 30
      );
  }
//   定义一个方法 用来检查蛇是否吃到啦食物   （在这可以同时看到蛇 和食物）
checkEat(X:number,Y:number){
if(X=== this.food.X && Y=== this.food.Y){
    console.log('吃到啦食物');
    //  食物位置重置
     this.food.change()
    //  分数加一
     this.scorePannel.addScore()
    //  蛇增加一节
     this.snake.addBody()
} 
}
}
export default GameControl;
